'use strict';
import { PROCESS } from './base/process';   // 进程管理
// import { Role } from './base/role';         // 角色
// import { Scene } from './base/scene';       // 场景
import { CoreError } from './base/core-error'; // 错误处理
import { Observer } from './base/observer'; // 事件


/**  
 * (Scene)    场景 -> 描绘、更新、状态 
 * (Role)     角色 -> 简介、行为
 * (Observer) 事件 -> 发展、影响
 * 
 ***** Role 通过 Observer 传递 State 与 Scene 进行交互
 *********************************************************
 ***** 对于单个 Web 页面而言，Role 与 Scene只能各存在一个 
 *
 * @property {object} Kernel 自引用，Kernel本身
 * @method ready DOM加成完成
 * @method mount 原型链挂载
 * @method module 创建一个类
 **/
export class Kernel extends Observer {
    constructor() {
        super();

        // 控制当前视图的实例化次数 
        if (PROCESS.PID > -1) {
            throw new CoreError(' Core class can only be instantiated once.'); 
        }
        PROCESS.PID = 1;

        this.process = PROCESS;
        this.isReady = false;   // DOM加载状态 
        // this.scene = new Scene();
        // this.role = new Role();

        const DOMContentLoaded = () => {
            document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false);
            this.ready();
        };

        if (/complete|loaded|interactive/.test(document.readyState) && document.body) {
            setTimeout(() => this.ready(), 0);
        } else {
            document.addEventListener("DOMContentLoaded", DOMContentLoaded, false);
        }
    }

    // 自引用
    get Kernel() {
        return Kernel;
    }

    /**
     * DOM结构加载完成
     * @param {*} argv 
     */
    ready(...argv) {
        if (argv.length === 0) {
            if (this.isReady) {
                return this;
            }

            this.emit('ready'); // 优先触发ready，再触发业务类的功能初始化函数
            this.emit('initial');
            this.isReady = true;
            return this;
        }

        this.on('ready', ...argv);
        return this;
    }

    /** 
     * 挂载指定的`对象`到Kernel上
     * @param {*} key 
     * @param {*} value 
     */
    mount(key, value, target) {
        target = 'object' === typeof target && target.prototype ? target : this.Kernel;
        if (Reflect.has(target.prototype, key)) {
            return
        } else if (value) {
            target.prototype[key] = value;
        }
        return this;
    }

    /**
     * 创建一个用户管理视图 
     * @param {*} argv 
     */
    module(...argv) {
        if (argv.length === 0) {
            return this;
        }

        const UserClass = argv[0];
        const instance = new UserClass();
        if ('function' !== typeof instance.initial) {
            throw new CoreError('业务控制器（UserController）必须提供一个初始化方法: initial'); 
        }

        if ('function' === typeof instance.preinitial) {
            instance.preinitial();
        }

        // 绑定页面初始化事件
        this.on('initial', function () {
            instance.initial(...argv.slice(1)); // 用户业务实例初始化
        });
        return this;
    }
}